﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<unordered_map>
#include<utility>
using namespace std;

//class Solution {
//public:
//    int getSum(int a, int b) {
//        int ret = a ^ b;
//        int carry = (a & b) << 1;
//        while (carry)
//        {
//            ret = ret ^ carry;
//            carry = (ret & carry) << 1;
//        }
//        return ret;
//    }
//};

//两整数之和（medium）位运算，太冗杂，垃圾代码，还得练
//class Solution {
//public:
//    int getSum(int a, int b) {
//        int ret = a ^ b;
//        int carry = (a & b) << 1;
//        while (carry)
//        {
//            int tmp = ret;
//            ret = ret ^ carry;
//            carry = (tmp & carry) << 1;
//        }
//        return ret;
//    }
//};

//class Solution {
//public:
//    int getSum(int a, int b) {
//        while (b)
//        {
//            int carry = (a & b) << 1;
//            a = a ^ b;
//            b = carry;
//        }
//        return a;
//    }
//};
// 
// 
//只出现⼀次的数字II（medium）--哈希表

//class Solution {
//public:
//    int singleNumber(vector<int>& nums) {
//        int n = nums.size();
//        unordered_map<int, int> m(n);
//        for (auto& v : nums)
//        {
//            m[v]++;
//        }
//        int ans = 0;
//        for (pair<int, int> i : m) {
//            if (i.second == 1) {
//                ans = i.first;
//                break;
//            }
//        }
//        return ans;
//    }
//};
//位运算：多加练习，把一个整数看成32个比特位，每个整数不同，其实就是32位的比特位不同
//
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for (int i = 0; i < 32; ++i) {
            int total = 0;
            //把32位的每一位的值提取出来
            for (int num : nums) {
                total += ((num >> i) & 1);
            }
            //把32位的每一位都添加倒ret的变量中
            if (total % 3) {
                ans |= (1 << i);
            }
        }
        return ans;
    }
};

int main()
{
    /*Solution s;
    s.getSum(2, 3);*/
    int n = 6;
    unordered_map<int,int> m(n);

    return 0;
}